* Additional ANES analysis for: 
* Class, Policy Attitudes and U.S. Presidential Voting in the Post-Industrial Era: The Importance of Issue Salience
* Franko & Witko
* Political Research Quarterly
* Date: 05/25/22


*******************************************************************************
* Presidential vote choice.
* Pooled models.
*******************************************************************************

* Create new frame to save results.
frame create dv_diffs_anes_ALT
frame dv_diffs_anes_ALT { 
	input 	str10 var diff ll ul str10 sample
		"egp1.5" . . . "All"
		"egp2.5" . . . "All"
		"inc5" . . . "All"
		"edu5" . . . "All"
		"white" . . . "All"
		"subclass" . . . "All"
		"egp1.5" . . . "White"
		"egp2.5" . . . "White"
		"inc5" . . . "White"
		"edu5" . . . "White"
		"subclass" . . . "White"
		"egp1.5" . . . "Nonwhite"
		"egp2.5" . . . "Nonwhite"
		"inc5" . . . "Nonwhite"
		"edu5" . . . "Nonwhite"
		"subclass" . . . "Nonwhite"
	end
}


*******************************************************************************
* Full sample.
*******************************************************************************
keep if year >= 1972

local varlst1 "white age female south"

foreach v in b5.egp5 inc5 edu5 subclass {
	if "`v'" == "b5.egp5" {
		melogit demvote `v' `varlst1' || year: 
		estimates store dv_egp5_anes_all_ALT
		margins , at(egp5=5) at(egp5=1) post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT { 
			replace diff = r(estimate) if var == "egp1.5" & sample == "All"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp1.5" & sample == "All"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp1.5" & sample == "All"
		}
		estimates restore dv_egp5_anes_all_ALT
		margins , at(egp5=5) at(egp5=2) post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT {
			replace diff = r(estimate) if var == "egp2.5" & sample == "All"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp2.5" & sample == "All"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp2.5" & sample == "All"
		}
	}
	else {
		melogit demvote `v' `varlst1' || year: 
		estimates store dv_`v'_anes_all_ALT
		margins , at((p5) `v') at((p95) `v') post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT { 
			replace diff = r(estimate) if var == "`v'" & sample == "All"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "`v'" & sample == "All"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "`v'" & sample == "All"
		}
	}
}

* Full sample, without class covariates.
melogit demvote `varlst1' || year: 
estimates store dv_nocls_anes_all_ALT
* Difference for white/non-white.
margins , at(white=0) at(white=1) post
lincom _b[1._at] - _b[2._at]
frame dv_diffs_anes_ALT {
	replace diff = r(estimate) if var == "white" & sample == "All"
	replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "white" & sample == "All"
	replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "white" & sample == "All"
}


* Full sample, include all covariates.
melogit demvote b5.egp5 inc5 edu5 subclass `varlst1' || year: 
estimates store dv_full_anes_all_ALT



*******************************************************************************
* Repeat above analysis for white only subsample.
*******************************************************************************

local varlst2 "age female south"

foreach v in b5.egp5 inc5 edu5 subclass {
	if "`v'" == "b5.egp5" {
		melogit demvote `v' `varlst2' if white==1 || year:  
		estimates store dv_egp5_anes_wo_ALT
		margins , at(egp5=5) at(egp5=1) post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT { 
			replace diff = r(estimate) if var == "egp1.5" & sample == "White"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp1.5" & sample == "White"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp1.5" & sample == "White"
		}
		estimates restore dv_egp5_anes_wo_ALT
		margins , at(egp5=5) at(egp5=2) post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT {
			replace diff = r(estimate) if var == "egp2.5" & sample == "White"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp2.5" & sample == "White"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp2.5" & sample == "White"
		}
	}
	else {
		melogit demvote `v' `varlst2' if white==1 || year:  
		estimates store dv_`v'_anes_wo_ALT
		margins , at((p5) `v') at((p95) `v') post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT { 
			replace diff = r(estimate) if var == "`v'" & sample == "White"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "`v'" & sample == "White"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "`v'" & sample == "White"
		}
	}
}


* White only subsample, include all covariates.
melogit demvote b5.egp5 inc5 edu5 subclass `varlst2' if white==1 || year:  
estimates store dv_full_anes_wo_ALT


*******************************************************************************
* Repeat above analysis for nonwhite subsample.
*******************************************************************************

local varlst2 "age female south"

foreach v in b5.egp5 inc5 edu5 subclass {
	if "`v'" == "b5.egp5" {
		melogit demvote `v' `varlst2' if white==0 || year:  
		estimates store dv_egp5_anes_nwo_ALT
		margins , at(egp5=5) at(egp5=1) post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT { 
			replace diff = r(estimate) if var == "egp1.5" & sample == "Nonwhite"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp1.5" & sample == "Nonwhite"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp1.5" & sample == "Nonwhite"
		}
		estimates restore dv_egp5_anes_nwo_ALT
		margins , at(egp5=5) at(egp5=2) post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT {
			replace diff = r(estimate) if var == "egp2.5" & sample == "Nonwhite"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "egp2.5" & sample == "Nonwhite"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "egp2.5" & sample == "Nonwhite"
		}
	}
	else {
		melogit demvote `v' `varlst2' if white==0 || year:  
		estimates store dv_`v'_anes_nwo_ALT
		margins , at((p5) `v') at((p95) `v') post
		lincom _b[1._at] - _b[2._at]
		frame dv_diffs_anes_ALT { 
			replace diff = r(estimate) if var == "`v'" & sample == "Nonwhite"
			replace ll = r(estimate) + invnorm(0.025)*r(se) if var == "`v'" & sample == "Nonwhite"
			replace ul = r(estimate) + invnorm(0.975)*r(se) if var == "`v'" & sample == "Nonwhite"
		}
	}
}


* Nonwhite only subsample, include all covariates.
melogit demvote b5.egp5 inc5 edu5 subclass `varlst2' if white==0 || year:  
estimates store dv_full_anes_nwo_ALT


***** Save Min/max difference results.
frame dv_diffs_anes_ALT : save "results/dv_diffs_anes_ALT.dta", replace



*******************************************************************************
* Presidential vote choice.
* Allow social class coefficients to vary by year, then plot effects over time.
*******************************************************************************

*******************************************************************************
* Full sample.
*******************************************************************************

local varlst1 "white age female south"

* EGP social class, two separate models for random coefficients.
melogit demvote egp5_1-egp5_4 `varlst1' || year: egp5_1 egp5_2 , intmethod(mc)
estimates store dv_egp1_anes_T_ALT

melogit demvote egp5_1-egp5_4 `varlst1' || year: egp5_3 egp5_4, intmethod(mc)
estimates store dv_egp2_anes_T_ALT

* Estimated effects: use coefficients.
* Model 1.
preserve
estimates restore dv_egp1_anes_T_ALT

gen b_egp = .
gen se_egp = .

predict egp_re1 egp_re2 egp_re_c if e(sample), reffects reses(egp_rese1 egp_rese2 egp_rese_cons)

foreach n of numlist 1 2 {
	replace b_egp = _b[egp5_`n'] + egp_re`n' if egp5_`n' == 1
	replace se_egp = sqrt((_se[egp5_`n']^2) + (egp_rese`n'^2)) if egp5_`n' == 1
}

collapse b_egp se_egp, by(year egp5)
gen b_egp_hi = b_egp + 1.96*se_egp
gen b_egp_lo = b_egp - 1.96*se_egp

drop if b_egp == .

save "results/dv_egp1_anes_T_ALT.dta", replace
restore

* Model 2.
preserve
estimates restore dv_egp2_anes_T_ALT

gen b_egp = .
gen se_egp = .

predict egp_re3 egp_re4 egp_re_c if e(sample), reffects reses(egp_rese3 egp_rese4 egp_rese_cons)

foreach n of numlist 3 4 {
	replace b_egp = _b[egp5_`n'] + egp_re`n' if egp5_`n' == 1
	replace se_egp = sqrt((_se[egp5_`n']^2) + (egp_rese`n'^2)) if egp5_`n' == 1
}

collapse b_egp se_egp, by(year egp5)
gen b_egp_hi = b_egp + 1.96*se_egp
gen b_egp_lo = b_egp - 1.96*se_egp

drop if b_egp == .

save "results/dv_egp2_anes_T_ALT.dta", replace
restore


* All other class variables.
foreach v in inc5 edu5 subclass {
	melogit demvote `v' `varlst1' || year: `v' 
	estimates store dv_`v'_anes_T_ALT
	* Estimated effects: use coefficients.
	preserve
	predict b_re* if e(sample), reffects reses(b_rese*)

	gen b = _b[`v'] + b_re1
	gen se = sqrt((_se[`v']^2) + (b_rese1^2))

	collapse b se, by(year)
	gen b_hi = b + 1.96*se
	gen b_lo = b - 1.96*se

	drop if b == .
	gen str20 var = "`v'"

	save "results/dv_`v'_anes_T_ALT.dta", replace
	restore
}


